package com.wanqing.service;

import com.wanqing.dto.UserVoucherPageQueryDTO;
import com.wanqing.dto.VoucherDTO;
import com.wanqing.dto.VoucherPageQueryDTO;
import com.wanqing.dto.VoucherReceiveDTO;
import com.wanqing.entity.Voucher;
import com.wanqing.entity.VoucherRule;
import com.wanqing.result.PageResult;
import com.wanqing.vo.UserVoucherVO;
import com.wanqing.vo.VoucherVO;

import java.util.List;

/**
 * 优惠券服务接口
 * 定义优惠券管理相关的核心业务方法
 */

public interface VoucherService {

    /**
     * 创建优惠券（包含规则）
     *
     * @param voucherDTO 优惠券信息DTO
     */
    void createVoucher(VoucherDTO voucherDTO);

    /**
     * 根据ID查询优惠券详情
     */
    VoucherVO getVoucherDetail(Long id);

    /**
     * 分页查询优惠券列表
     */
    PageResult getVoucherList(VoucherPageQueryDTO voucherPageQueryDTO);


    /**
     * 更新优惠券信息
     *
     * @param voucherDTO 优惠券数据传输对象，包含优惠券的相关信息
     */
    void updateVoucher(VoucherDTO voucherDTO);

    /**
     * 更新优惠券状态
     *
     * @param id     优惠券ID，用于标识特定的优惠券
     * @param status 新的状态值，用于更新优惠券的状态
     */
    void updateVoucherStatus(Long id, Byte status);

    /**
     * 批量删除优惠券
     *
     * @param ids 优惠券ID列表，标识待删除的优惠券
     */
    void deleteBatch(List<Long> ids);

    /**
     * 领取优惠券
     *
     * @param dto 优惠券领取信息数据传输对象，包含领取优惠券所需的信息
     */
    void receiveVoucher(VoucherReceiveDTO dto);

    /**
     * 获取用户优惠券列表
     *
     * @param userVoucherPageQueryDTO 用户优惠券页面查询对象，包含查询用户优惠券列表的条件
     * @return PageResult 分页结果对象，包含查询到的用户优惠券列表信息
     */
    PageResult listUserVouchers(UserVoucherPageQueryDTO userVoucherPageQueryDTO);

    /**
     * 使用优惠券
     *
     * @param id      优惠券ID，标识待使用的优惠券
     * @param orderId 订单ID，标识使用优惠券的订单
     */
    void useVoucher(Long id, Long orderId);

    /**
     * 检查用户优惠券是否过期
     */
    void checkExpiredUserVoucher();

    /**
     * 检查优惠券是否过期
     */
    public void checkExpiredVoucher();

    /**
     * 用户端展示优惠券
     *
     * @return List<VoucherVO> 优惠券视图对象列表，包含用户可获得的优惠券信息
     */
    List<VoucherVO> getVoucherListUser();

    /**
     * 根据优惠券ID获取用户优惠券规则
     *
     * @param id
     * @return
     */
    VoucherRule getUserVoucherRuleById(Long id);
}
